package net.sudot.commons.lock;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 业务同步锁
 * <pre>
 *     解决业务并发问题
 * </pre>
 *
 * @author tangjialin on 2018-04-01.
 */
@Target({ElementType.PARAMETER, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Lock {
    /** 锁的名称 */
    String name();

    /** 锁的键 */
    String value() default "";

    /** 过期时间(单位:秒).默认:10分钟.0或小于0都表示立即过期 */
    int expirationTime() default 60 * 10;

    /** 若锁获取失败,重试最大时长(单位:秒).默认:0秒(0或负值都表示获取失败则立刻返回) */
    long timeout() default 0;

    /** 未成功锁住是否抛出异常.true:抛出UnlockException,false:不做任何处理 */
    boolean throwUnlock() default true;
}